package bavaria.hightech.banking;

import bavaria.hightech.buchung.Buchungsliste;
import bavaria.hightech.exceptions.BoniUeberzogenException;
import bavaria.hightech.geld.Money;
import bavaria.hightech.geld.Waehrung;
import bavaria.hightech.konditionen.FestgeldKonditionen;
import bavaria.hightech.konditionen.FestgeldKonditionen.Laufzeit;
import bavaria.hightech.konditionen.Konditionen;

public abstract class Konto {
	
	protected int kontonr;
	protected Money kontostand;
	protected String kontoinhaber;
	protected String kontotyp;
	protected Konditionen konditionen;
	private Buchungsliste liste = new Buchungsliste();
	
	public Konto(int kn, Money money, String ki, String typ, Konditionen kon){
		kontonr = kn;
		kontoinhaber = ki;
		kontostand = money;
		kontotyp = typ;
		konditionen = kon;
	}
	
	public void abgang(Money money, String grund){
		char c = '-';
		if (money.betrag >= 0){
			verbuchen(money, grund, c);
		}
		else
			System.out.println("Betrag falsch eingegeben!");
	}
	
	public void zugang(Money money, String grund){
		char c = '+';
		if (money.betrag >= 0)
			verbuchen(money, grund, c);
		else
			System.out.println("Betrag falsch eingegeben!");
	}
	
	private void verbuchen(Money money, String grund, char c){
		if(c == '+')
			kontostand = money.addieren(kontostand, money);
		else if (c == '-')
			kontostand = money.subtra(kontostand, money);
		liste.add(grund, money);
	}
	
	public abstract void verzinsen();
	public abstract void verzinsen(Laufzeit lauf);
	
	public String buchungen(){
		liste.resetIteration();
		StringBuffer sb = new StringBuffer();
		while(liste.position != null){
			sb.append("Buchungsgrund: " + liste.position.buchungstext + " Buchungsbetrag: " + liste.position.money.betrag + " " + liste.position.money.waehrung + "\n");
			liste.next();
		}
		String s = sb.toString();
		return s;
	}
	
	public String toString(){
		String s = "Kontoinhaber: " + kontoinhaber + ", Kontonummer: " + kontonr + ", Kontostand: " + kontostand.betrag + " " + kontostand.waehrung;
		return s;
	}
	
	public abstract Konditionen getKondition();
	
	
	public static void main(String[] args){
		BankImpl bank = new BankImpl();
		bank.neuesGirokonto("Test", Waehrung.EUR);
		
		Money money = new Money(100, Waehrung.EUR);
		Money money1 = new Money(10, Waehrung.EUR);
		Money money2 = new Money(512, Waehrung.EUR);
		Money money3 = new Money(500, Waehrung.EUR);

		Money money4 = new Money(-4, Waehrung.EUR);
		Money money5 = new Money(-5, Waehrung.EUR);
		Money money6 = new Money(-6, Waehrung.EUR);
		Money money7 = new Money(-7, Waehrung.EUR);
		
		bank.getKonto(1000).zugang(money3, "Geburtstag");
		bank.getKonto(1000).abgang(money, "Bier");
		bank.getKonto(1000).verzinsen();
		bank.getKonto(1000).abgang(money2, "Bam");
		bank.getKonto(1000).verzinsen();
		bank.getKonto(1000).zugang(money4, "hm");
		bank.getKonto(1000).abgang(money5, "hmm");
		
		System.out.println();
		
		
		bank.neuesFestgeldkonto("Test2", "THREE", Waehrung.EUR);
		bank.getKonto(1001).abgang(money1, "Sohalt");
		bank.getKonto(1001).zugang(money, "Lohn");
		bank.getKonto(1001).verzinsen();
		bank.getKonto(1001).zugang(money6, "hmmm");
		bank.getKonto(1001).abgang(money7, "hmmmm");
		
		System.out.println(bank.getKonto(1000).konditionen);
		
		System.out.println(bank.getKonto(1000).buchungen());
	}


}